
package com.zjff.myshop.front.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.zjff.myshop.common.Constants;
import com.zjff.myshop.entity.Cart;
import com.zjff.myshop.entity.Goods;
import com.zjff.myshop.exception.BusinessException;
import com.zjff.myshop.front.pojo.vo.CartVO;
import com.zjff.myshop.front.service.CartService;
import com.zjff.myshop.front.service.GoodsService;
import com.zjff.myshop.mapper.CartMapper;
import com.zjff.myshop.util.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

@Service
public class CartServiceImpl implements CartService {

    @Resource
    private CartMapper cartMapper;
    @Resource
    private GoodsService goodsService;

    /**
     * 增加商品至购物车中
     */
    @Override
    public Boolean insert(Cart cart) {
        //检查商品是否存在
        Goods goods = goodsService.selectByPrimaryKey(cart.getGoodsId());
        if (goods == null) {
            throw new BusinessException("商品不存在");
        }

        //超出单个商品的最小数量
        if (cart.getCount() < 1) {
            throw new BusinessException("商品数量不能小于1");
        }
        //超出单个商品的最大数量
        if (cart.getCount() > Constants.SHOPPING_CART_ITEM_LIMIT_NUMBER) {
            throw new BusinessException("购物车单个商品数量不能超过"+Constants.SHOPPING_CART_ITEM_LIMIT_NUMBER);
        }

        //每个用户购物车记录数是由限制的，不允许超出最大数量
        int totalItem = cartMapper.countByUserId(cart.getUserId());
        if (totalItem > Constants.SHOPPING_CART_ITEM_TOTAL_NUMBER) {
            throw new BusinessException("购物车商品总数不能超过"+Constants.SHOPPING_CART_ITEM_TOTAL_NUMBER);
        }

        //购物车商品不能有重复项,如果重复，则累加数量
        Integer goodsId = cart.getGoodsId();
        Cart cartDb = cartMapper.selectByUserIdAndGoodsId(cart.getUserId(), goodsId);
        if (ObjectUtil.isNotNull(cartDb)) {
            //数据库中已有记录，则累加//
            int count = cartDb.getCount() + cart.getCount();
            //超出单个商品的最大数量
            if (count > Constants.SHOPPING_CART_ITEM_LIMIT_NUMBER) {
                throw new BusinessException("购物车单个商品数量不能超过"+Constants.SHOPPING_CART_ITEM_LIMIT_NUMBER);
            }
            cartDb.setCount(count);
            return cartMapper.update(cartDb) > 0;
        } else {
            //数据库中没有记录，新增
            //保存记录,并返回
            cart.setId(null);
            return cartMapper.insert(cart) > 0;
        }
    }

    /**
     * 删除购物车中的商品
     */
    @Override
    public Boolean deleteById(Integer cartItemId, Integer userId) {
        Cart cart = cartMapper.selectByPrimaryKey(cartItemId);
        if (cart == null) {
            throw new BusinessException("id对应的购物车项不存在");
        }

        //是否当前用户的数据
        if (!userId.equals(cart.getUserId())) {
            throw new BusinessException("业务数据不是你的，禁止该操作");
        }
        return cartMapper.deleteByPrimaryKey(cartItemId) > 0;
    }

    /**
     * 删除购物车中的商品（多个）
     */
    @Override
    public Boolean deleteBatch(Integer[] ids) {
        return cartMapper.deleteBatch(ids) > 0;
    }

    /**
     * 删除购物车中的商品（全部）
     */
    @Override
    public Boolean deleteByUserId(Integer userId) {
        return cartMapper.deleteByUserId(userId) > 0;
    }


    /**
     * 更改购物车项
     */
    @Override
    public Boolean update(Cart cart) {
        //检查数据库中是否存在要更改的项，没有则抛出异常
        Cart cartTemp = cartMapper.selectByPrimaryKey(cart.getId());
        if (cartTemp == null) {
            throw new BusinessException("id对应的购物车项不存在");
        }

        //检查是否当前用户的数据，，不是则抛出异常
        if (!cartTemp.getUserId().equals(cart.getUserId())) {
            throw new BusinessException("业务数据不是你的，禁止该操作");
        }

        //更改记录,并返回
        return cartMapper.update(cart) > 0;
    }

    /**
     * 更改我的购物车全部项是否勾选
     */
    @Override
    public Boolean updateIsCheckedAllByUserId(Boolean isChecked, Integer userId) {
        return cartMapper.updateIsCheckedAllByUserId(isChecked, userId) > 0;
    }

    /**
     * 查询我的购物车列表
     */
    @Override
    public List<CartVO> selectVOList(HashMap map) {
        List<CartVO> cartVOList = new ArrayList<>();
        List<HashMap<String, Object>> mapList = cartMapper.selectVOList(map);
        //Map数组转Bean数组
        for (HashMap<String, Object> item : mapList) {
            CartVO vo = BeanUtils.mapToBean(item, CartVO.class);
            if (ObjectUtil.isNotNull(vo)) {
                cartVOList.add(vo);
            }
        }
        return cartVOList;
    }
}
